package com.qfedu.demo.config;

import com.qfedu.demo.dao.UserDao;
import com.qfedu.demo.dao.impl.UserDaoCache;
import com.qfedu.demo.dao.impl.UserDaoNormal;
import com.qfedu.demo.service.UserService;
import com.qfedu.demo.service.impl.UserServiceNormal;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


//java装配的歧义性解决方法和自动装配解决歧义性的方法一样
//为什么使用java装配：引入第三方的库时，它里面的类没有@Component

@Configuration //配置类
public class AppConfig {

    //@Qualifier("normal") //方式一
    @Bean//("normal")    //Spring应用程序启动的时候，自动调用注解了@Bean的函数（java装配，因为类中没有使用@Component）
    public UserDao userDaoNormal(){ //如果Spring容器中有了UserDao对象，就不会再次调用这个方法,UserDao这个对象实例在容器中只用一个，它是单例的
        System.out.println("创建UserDaoNormal对象...");
        return new UserDaoNormal();
    }

    //@Qualifier("cache")方式一
    @Bean //("cache")   //解决java装配歧义性方式二：给Bean一个参数，测试类中使用Qualifier
    public UserDao userDaoCache(){  //解决java装配歧义性方式三：使用默认id(@Bean下面方法的方法名)加@Qualifier
        System.out.println("创建UserDaoCache对象。。。");
        return new UserDaoCache();
    }

    @Bean
    //public UserService UserServiceNormal( UserDao userDao){ //更优雅的依赖注入在@Bean方法中使用参数比（1）好看一些
    public UserService userServiceNormal(@Qualifier("userDaoNormal") UserDao userDao){   //解决java装配歧义性方式一 ：使用Qualifier
        System.out.println("创建UserService对象。。");
        //(1)  UserDao userDao= userDaoNormal();//userDaoNormal()是上面的方法，相当于new UserDaoNormal();
        //return new UserServiceNormal(userDao);      //java装配时依赖注入方式一：通过构造函数(UserServiceNormal中有userDao.add();而UserDao没有使用自动装配（@Autowired）)
       UserServiceNormal userService= new UserServiceNormal();//java装配时依赖注入方式二 ： 使用setter方法（或自己定义的任意方法）进行依赖注入
       userService.setUserDao(userDao);                       //方式二
       return  userService;                                   //方式二
    }

}
